home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / keymon.e < prev    next >
Text File  |  1993-07-21  |  4KB  |  184 lines

  1. /*
  2.     Keyboard monitor v1.0
  3. */
  4. MODULE 'commodities','libraries/commodities','exec/ports','dos/dos','devices/inputevent',
  5.     'intuition/intuition','intuition/intuitionbase','intuition/screens',
  6.     'workbench/startup','workbench/workbench','icon','keymap'
  7. ENUM NOERROR,ER_NOLIBRARY,ER_MESSAGEPORT
  8. CONST GOT_ONE=232
  9.  
  10. DEF broker:PTR TO newbroker,messport:PTR TO mp,brokerobj,cxsigbit,filter,sender,
  11.     buff
  12.  
  13. PROC main()
  14.     DEF wb:PTR TO wbstartup,wba:PTR TO wbarg,dobj:PTR TO diskobject,toolarray,
  15.     str,olddir=0,pri=0,read,rdargs,myargs[2]:LIST
  16.  
  17.     /* Probably will run under V36, but who still has only V36? */
  18.     /* Besides, V36 sucks. */
  19.     IF (KickVersion(37))=FALSE
  20.         WriteF('Sorry, requires Kick V37+\n')
  21.         getout(0)
  22.     ENDIF
  23.     IF (cxbase:=OpenLibrary('commodities.library',37))=0
  24.         error(ER_NOLIBRARY,'commodities')
  25.     ENDIF
  26.     IF (keymapbase:=OpenLibrary('keymap.library',37))=0
  27.         error(ER_NOLIBRARY,'keymap')
  28.     ENDIF
  29.     IF (iconbase:=OpenLibrary('icon.library',37))=0
  30.         error(ER_NOLIBRARY,'icon')
  31.     ENDIF
  32.     /*
  33.         This checks the tooltypes or command line arguments
  34.         for priority.
  35.     */
  36.     IF wbmessage
  37.         wb:=wbmessage ; wba:=wb.arglist
  38.         IF (wba.lock>0) AND (wba.name>0)
  39.             olddir:=CurrentDir(wba.lock)
  40.         ENDIF
  41.         IF (dobj:=GetDiskObject(wba.name))>0
  42.             toolarray:=dobj.tooltypes
  43.             IF (str:=FindToolType(toolarray,'CX_PRIORITY'))>0
  44.                 pri:=Val(str,read)
  45.                 IF read=0
  46.                     pri:=0
  47.                 ENDIF
  48.             ENDIF
  49.             /* Add more checks here, before the freediskobject */
  50.             FreeDiskObject(dobj)
  51.         ENDIF
  52.         IF olddir>0
  53.             CurrentDir(olddir)
  54.         ENDIF
  55.     ELSE
  56.         /*
  57.             If commodity accepts other commodity args, like CX_POPKEY, or CX_POPUP
  58.             or whatever it's called, they're put in the command line args as
  59.             /K types. (Like here)
  60.         */
  61.         IF (rdargs:=ReadArgs('CX_PRIORITY/N/K',myargs,0))>0
  62.             pri:=Long(myargs[0])
  63.             FreeArgs(rdargs)
  64.         ENDIF
  65.     ENDIF
  66.  
  67.     broker:=[NB_VERSION,0,'KeyMon','Keyboard Input Monitor','Buffers keyboard input to a file.',
  68.     NBU_UNIQUE OR NBU_NOTIFY,0,0,0,0]:newbroker
  69.     IF (messport:=CreateMsgPort())>0
  70.         broker.port:=messport
  71.         IF (brokerobj:=CxBroker(broker,0))>0
  72.             cxsigbit:=Shl(1,messport.sigbit)
  73.             IF (sender:=cxsender(messport,GOT_ONE))>0
  74.                 AttachCxObj(brokerobj,sender)
  75.                 ActivateCxObj(brokerobj,1)
  76.                 justdoit()
  77.             ENDIF
  78.             getout(0)
  79.         ENDIF
  80.     ELSE
  81.         error(ER_MESSAGEPORT,0)
  82.     ENDIF
  83.     getout(0)
  84. ENDPROC
  85. CHAR '$VER: Keymon v1.0 (C) 1994 Jason Maskell',0
  86.  
  87. PROC justdoit()
  88.     DEF msg:PTR TO mn,sigrcvd,msgid,msgtype,ievent:PTR TO inputevent,num
  89.     buff:=New(100)
  90.     LOOP
  91.         sigrcvd:=Wait(SIGBREAKF_CTRL_C OR cxsigbit)
  92.         WHILE (msg:=GetMsg(messport))
  93.             ievent:=CxMsgData(msg) ; msgtype:=CxMsgType(msg) ; ReplyMsg(msg)
  94.             SELECT msgtype
  95.                 CASE CXM_IEVENT
  96.                     IF ievent.class=IECLASS_RAWKEY
  97.                             num:=MapRawKey(ievent,buff,100,0)
  98.                         IF num=1
  99.                             Write(stdout,buff,num)
  100.                         ENDIF
  101.                     ENDIF
  102.                 CASE CXM_COMMAND
  103.                     msgid:=CxMsgID(msg)
  104.                     SELECT msgid
  105.                         CASE CXCMD_DISABLE
  106.                             ActivateCxObj(brokerobj,0)
  107.                         CASE CXCMD_ENABLE
  108.                             ActivateCxObj(brokerobj,1)
  109.                         CASE CXCMD_KILL
  110.                             RETURN 0
  111.                         CASE CXCMD_UNIQUE
  112.                             RETURN 0
  113.                     ENDSELECT
  114.             ENDSELECT
  115.         ENDWHILE
  116.         IF (sigrcvd AND SIGBREAKF_CTRL_C)
  117.             RETURN 0
  118.         ENDIF
  119.     ENDLOOP
  120. ENDPROC
  121. /*
  122.     Commodities macros...
  123. */
  124. PROC cxsender(port,id)
  125. ENDPROC CreateCxObj(CX_SEND,port,id)
  126.  
  127. /*
  128.     These are the commodities macros taken from the includes.h files..
  129.     They allow you to use the rkm examples pretty easily.
  130. */
  131.  
  132. /*
  133. PROC cxfilter(d)
  134. ENDPROC CreateCxObj(CX_FILTER,d,0)
  135. PROC cxtypefilter(type)
  136. ENDPROC CreateCxObj(CX_TYPEFILTER,type,0)
  137. PROC cxsignal(task,sig)
  138. ENDPROC CreateCxObj(CX_SIGNAL,task,sig)
  139. PROC cxtranslate(ie)
  140. ENDPROC CreateCxObj(CX_TRANSLATE,ie,0)
  141. PROC cxdebug(id)
  142. ENDPROC CreateCxObj(CX_DEBUG,id,0)
  143. PROC cxcustom(action,id)
  144. ENDPROC CreateCxObj(CX_CUSTOM,action,id)
  145. */
  146. PROC getout(retcode)
  147.     DEF msg:PTR TO mn
  148.  
  149.     IF brokerobj
  150.         DeleteCxObjAll(brokerobj)
  151.     ENDIF
  152.     IF messport
  153.         WHILE (msg:=GetMsg(messport))
  154.             ReplyMsg(msg)
  155.         ENDWHILE
  156.         DeleteMsgPort(messport)
  157.     ENDIF
  158.     IF cxbase
  159.         CloseLibrary(cxbase)
  160.     ENDIF
  161.     IF keymapbase
  162.         CloseLibrary(keymapbase)
  163.     ENDIF
  164.     IF iconbase
  165.         CloseLibrary(iconbase)
  166.     ENDIF
  167.     CleanUp(retcode)
  168. ENDPROC
  169.  
  170. PROC error(errnum,str)
  171.     DEF work[80]:STRING
  172.     SELECT errnum
  173.         CASE ER_NOLIBRARY
  174.             StringF(work,'Unable to open \s.library V37+',str)
  175.         CASE ER_MESSAGEPORT
  176.             StringF(work,'Unable to create message port.')
  177.         DEFAULT
  178.     ENDSELECT
  179.     request(work,'Ok',0)
  180.     getout(11)
  181. ENDPROC
  182. PROC request(body,gadgets,args)
  183. ENDPROC EasyRequestArgs(0,[20,0,0,body,gadgets],0,args)
  184.